package main

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
)

// initLogger 初始化全局日志系统
// 功能：配置并设置全局默认日志记录器，便于在整个应用程序中使用
// 全局日志器的优势：
// - 无需在每个函数中传递logger实例
// - 统一的日志配置和格式
// - 便于集中管理和维护
func initLogger() {
	// 使用 zap 的开发环境配置
	// NewDevelopmentConfig() 提供适合开发环境的默认配置
	cfg := zap.NewDevelopmentConfig()
	// 设置日志时间格式为 "年-月-日 时:分:秒"
	// 使用Go语言特定的时间格式模板：2006-01-02 15:04:05
	cfg.EncoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05")
	// 构建日志记录器并设置为全局默认
	logger, _ := cfg.Build()
	// 将自定义logger设置为全局默认日志记录器
	// 之后可以通过 zap.L() 和 zap.S() 访问全局日志器
	zap.ReplaceGlobals(logger)
}

// main 函数演示全局日志器的使用
// 全局日志器适用于大型项目，可以避免logger实例的传递和重复创建
func main() {
	// 初始化全局日志系统
	initLogger()

	// 使用标准日志记录器（结构化日志）
	// zap.L() 返回全局的Logger实例，支持结构化日志记录
	zap.L().Info("dev this is info")   // 信息级别日志
	zap.L().Warn("dev this is warn")   // 警告级别日志
	zap.L().Error("dev this is error") // 错误级别日志

	// 使用 Sugar 日志记录器（格式化日志）
	// zap.S() 返回全局的Sugar Logger实例，支持格式化字符串
	// Sugar Logger提供更简洁的API，类似于fmt.Sprintf
	zap.S().Infof("dev this is info %s", "xxx")   // 格式化信息日志
	zap.S().Warnf("dev this is warn %s", "xxx")   // 格式化警告日志
	zap.S().Errorf("dev this is error %s", "xxx") // 格式化错误日志
}
